package es.udc.fbellas.j2ee.tiendaweb.model.productofacade.plain;

import java.util.ArrayList;
import java.util.List;

import javax.sql.DataSource;

import es.udc.fbellas.j2ee.tiendaweb.model.carrito.Carrito;
import es.udc.fbellas.j2ee.tiendaweb.model.carrito.LineaCarrito;
import es.udc.fbellas.j2ee.tiendaweb.model.categoria.TO.CategoriaTO;
import es.udc.fbellas.j2ee.tiendaweb.model.detallespedido.TO.DetallesPedidoTO;
import es.udc.fbellas.j2ee.tiendaweb.model.direccionpostal.TO.DireccionPostalTO;
import es.udc.fbellas.j2ee.tiendaweb.model.productofacade.TO.PedidoChunkTO;
import es.udc.fbellas.j2ee.tiendaweb.model.productofacade.TO.ProductoChunkTO;
import es.udc.fbellas.j2ee.tiendaweb.model.productofacade.delegate.ProductoFacadeDelegate;
import es.udc.fbellas.j2ee.tiendaweb.model.productofacade.plain.actions.BuscarPorPalabrasAction;
import es.udc.fbellas.j2ee.tiendaweb.model.productofacade.plain.actions.BuscarPorPalabrasYCategoriaAction;
import es.udc.fbellas.j2ee.tiendaweb.model.productofacade.plain.actions.ComprarProductosAction;
import es.udc.fbellas.j2ee.tiendaweb.model.productofacade.plain.actions.ObtenerCategoriasAction;
import es.udc.fbellas.j2ee.tiendaweb.model.productofacade.plain.actions.PropiedadesProductoAction;
import es.udc.fbellas.j2ee.tiendaweb.model.productofacade.plain.actions.VisualizarPedidoAction;
import es.udc.fbellas.j2ee.tiendaweb.model.propiedad.TO.PropiedadTO;
import es.udc.fbellas.j2ee.tiendaweb.model.tarjetabancaria.TO.TarjetaBancariaTO;
import es.udc.fbellas.j2ee.tiendaweb.model.util.GlobalNames;
import es.udc.fbellas.j2ee.util.exceptions.InstanceNotFoundException;
import es.udc.fbellas.j2ee.util.exceptions.InternalErrorException;
import es.udc.fbellas.j2ee.util.exceptions.ModelException;
import es.udc.fbellas.j2ee.util.sql.DataSourceLocator;
import es.udc.fbellas.j2ee.util.sql.PlainActionProcessor;

public class PlainProductoFacadeDelegate implements ProductoFacadeDelegate {

	private DataSource dataSource;
    private Carrito carrito;
    
    private DataSource getDataSource() throws InternalErrorException {
        return DataSourceLocator.getDataSource(
            GlobalNames.TIENDAWEB_DATA_SOURCE);
    }

    public PlainProductoFacadeDelegate() {
        carrito = new Carrito();
    }
    
    public List<CategoriaTO> obtenerCategorias()
    throws InternalErrorException{
    	List<CategoriaTO> listaDeCategorias = new ArrayList<CategoriaTO>();
        try {
        	ObtenerCategoriasAction action = new ObtenerCategoriasAction();    
        	listaDeCategorias = (List<CategoriaTO>) PlainActionProcessor.process(getDataSource(),action);
        }catch (ModelException d) {
        	d.printStackTrace();
        }  
    	
    	return listaDeCategorias;
    }
    
    public List<PropiedadTO> propiedadesProducto(int idProducto)
    throws InternalErrorException{
    	List<PropiedadTO> lista = new ArrayList<PropiedadTO>();
        try {
        	PropiedadesProductoAction action = 
                new PropiedadesProductoAction(idProducto);    
        	lista = (List<PropiedadTO>) PlainActionProcessor.process(getDataSource(),action);
            
        } catch (InternalErrorException e) {
            throw e;
        }catch (ModelException d) {
            d.printStackTrace();
        }  
    	return lista;
    }

	public Carrito anhadirLogin(String login){
		carrito.setLogin(login);
		return carrito;
	}
     
    public ProductoChunkTO buscarPorPalabras(String palabras,int inicio, int elemPorGrupo) throws InternalErrorException {
            
            try {
            
            	BuscarPorPalabrasAction action = 
                    new BuscarPorPalabrasAction(palabras,inicio, elemPorGrupo);
            	
                    
                return (ProductoChunkTO) PlainActionProcessor.process(getDataSource(),action);
                
            } catch (InternalErrorException e) {
                throw e;
            }catch (Exception e) {
                throw new InternalErrorException(e);
            }       
        }
  

	public ProductoChunkTO buscarPorPalabrasYCategoria(String palabras, int categoria,int inicio, int elemPorGrupo) throws InternalErrorException {
		try {
            
        	BuscarPorPalabrasYCategoriaAction action = 
                new BuscarPorPalabrasYCategoriaAction(palabras,categoria,
                    inicio, elemPorGrupo);
                
            return (ProductoChunkTO) PlainActionProcessor.process(getDataSource(), 
                action);
            
        } catch (InternalErrorException e) {
            throw e;
        } catch (Exception e) {
            throw new InternalErrorException(e);
        }
        
    }

	public PedidoChunkTO visualizarPedido(int idPedido,int inicio,int elemPorGrupo)throws InternalErrorException{
		try {
            
        	VisualizarPedidoAction action = 
                new VisualizarPedidoAction(idPedido,inicio, elemPorGrupo);
                
            return (PedidoChunkTO) PlainActionProcessor.process(getDataSource(),action);
            
        } catch (InternalErrorException e) {
            throw e;
        } catch (Exception e) {
            throw new InternalErrorException(e);
        }
	}

	public Carrito anhadirProducto(int idProducto, int numUdads) throws InternalErrorException {
		carrito.anadeLinea(idProducto, numUdads);
		return carrito;
	}

	public Carrito eliminarProducto(int idProducto) throws InternalErrorException,InstanceNotFoundException {
		carrito.eliminaProducto(idProducto);
		return carrito;
	}

	public Carrito modifUnidades(int idProducto, int numUdads) throws InternalErrorException,InstanceNotFoundException {
		carrito.actualizaNumUnidades(idProducto, numUdads);
		return carrito;
	}

	public List<LineaCarrito> visualizarCarrito() throws InternalErrorException {
		return carrito.visualizaCarrito();
	}

	public DetallesPedidoTO comprarProductos(DireccionPostalTO dir, TarjetaBancariaTO tarjeta )
	throws InternalErrorException {
	     
        try {
        	
            ComprarProductosAction action = 
                new ComprarProductosAction(carrito,dir,tarjeta);
            return (DetallesPedidoTO) PlainActionProcessor.process(getDataSource(), action);
            
        } catch (InternalErrorException e) {
            throw e;
        } catch (Exception e) {
            throw new InternalErrorException(e);
        }
		
	}

    
}
